package respx

import (
	"github.com/gin-gonic/gin"
	"zhonghui/console/warehouse/envx"
)

// 全局统一返回结构体 gin
type meta struct {
	Msg   string      `json:"msg"`
	Code  string      `json:"code"`
	Debug string      `json:"debug"`
	Pager interface{} `json:"pager"`
	Extra interface{} `json:"extra"`
}

type res struct {
	Meta meta        `json:"meta"`
	Data interface{} `json:"data"`
}

// Bad 表单验证失败
func Bad(c *gin.Context, err error) {
	renderJSON(c, "WARN", "ValidationError", nil, nil, nil, err)
}

// UnAuth 授权失效
func UnAuth(c *gin.Context) {
	renderJSON(c, "Unauthorized", "UnAuth", nil, nil, nil, nil)
}

// Alert 业务错误、业务警告，前端直接将msg提示给用户
// 如果在error情况下调用本方法，业务内应记录log
func Alert(c *gin.Context, msg string) {
	renderJSON(c, "WARN", msg, nil, nil, nil, nil)
}

// Error 错误，建议只用于内网调用，不要用于前端接口返回
// 业务内应记录log
// 会将error信息放到debug中
func Error(c *gin.Context, msg string, err error) {
	renderJSON(c, "ERROR", msg, nil, nil, nil, err)
}

// Success 业务处理成功
func Success(c *gin.Context, data interface{}, pager interface{}) {
	renderJSON(c, "SUCCESS", "SUCCESS", data, nil, pager, nil)
}

func renderJSON(c *gin.Context, code string, msg string, data interface{}, extra interface{}, pager interface{}, err error) {
	response := res{
		Data: data,
		Meta: meta{
			Code:  code,
			Msg:   msg,
			Pager: pager,
			Extra: extra,
		},
	}

	if err != nil && !envx.InProd() {
		response.Meta.Debug = err.Error()
	}

	c.JSON(200, response)
}
